/*
 * Copyright (c) 2010 CCX(China) Co.,Ltd. All Rights Reserved.
 *
 * This software is the confidential and proprietary information of
 * CCX(China) Co.,Ltd. ("Confidential Information").
 * It may not be copied or reproduced in any manner without the express 
 * written permission of CCX(China) Co.,Ltd.
 *
 * @author luosisi
 * Date: 2010-7-6 下午04:15:16
 */
package com.ccxe.manage.filters;

import java.security.MessageDigest;
import java.util.Random;

/**
 * @author luosisi
 *
 * MD5的算法在RFC1321 中定义 在RFC 1321中，给出了Test suite用来检验你的实现是否正确：   
 * MD5 ("") = d41d8cd98f00b204e9800998ecf8427e   
 * MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661  
 * MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72   
 * MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0   
 * MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b  
 *   
 *   
 *  传入参数：一个字节数组 传出参数：字节数组的 MD5 结果字符串  
 */  
 
public class MdPwd {
	
	/**
	 * MD5加密
	 * @param pwd
	 * @return
	 */
    public static String getMD5(String pwd) {
    	if(pwd == null && "".equals(pwd)) {
    		return null;
    	}
        byte[] source = pwd.getBytes();   
        String s = null;   
        // 用来将字节转换成 16 进制表示的字符   
        char hexDigits[] = {    
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',   
                'e', 'f' };   
        try {   
            // MD5 的计算结果是一个 128 位的长整数， 用字节表示就是 16 个字节   
            MessageDigest md = MessageDigest.getInstance("MD5");   
            md.update(source);   
            byte tmp[] = md.digest();   
  
            // 每个字节用 16 进制表示的话，使用两个字符，所以表示成 16进制需要 32 个字符   
            char str[] = new char[16 * 2];   
  
            // 表示转换结果中对应的字符位置   
            int k = 0;   
  
            // 从第一个字节开始，对 MD5 的每一个字节转换成 16 进制字符的转换   
            for (int i = 0; i < 16; i++) {   
                // 取第 i 个字节   
                byte byte0 = tmp[i];   
                // 取字节中高 4 位的数字转换,>>> 为逻辑右移，将符号位一起右移   
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];   
                // 取字节中低 4 位的数字转换   
                str[k++] = hexDigits[byte0 & 0xf];   
            }   
            s = new String(str); // 换后的结果转换为字符串   
  
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
        return s.trim();   
    }   
    
    /**
     * 随机产生6位字符
     * @return 
     */
    public static String makeRandomPassword(){      
    	String radStr = "abcdefghijklmnopqrstuvwxyz0123456789"; 
        StringBuffer generateRandStr = new StringBuffer(); 
        Random rand = new Random(); 
        int length = 6; 
        for(int i=0;i<length;i++) 
        { 
            int randNum = rand.nextInt(36); 
            generateRandStr.append(radStr.substring(randNum,randNum+1)); 
        } 
        return generateRandStr+""; 
  }
   
    
    public static void main(String xu[]) { // 计算 "a" 的 MD5   
        // 代码，应该为：0cc175b9c0f1b6a831c399e269772661  
    	String mm ="e10adc3949ba59abbe56e057f20f883e";
    	System.out.println(MdPwd.getMD5("user"));   
        System.out.println(mm);   
    }   


}
